

/*
如果你需要为某个函数的所有参数(包括被 this 指针所指的那个隐喻参数)进行类型转换，那么这个函数必须是个non-member。
*/

#include<iostream>

class Rational
{
    public:
        Rational(int a = 0,int b = 1):a_(a),b_(b){};//不能使用explicit关键字，因为要做类型转换

        int getA()const{return a_;};
        int getB()const{return b_;};

        //Rational operator*(const Rational& temp){ return Rational(a_ * temp.a_,b_ * temp.b_);};在类内定义operator*，需要类型转换
        
    private:
        int a_,b_;
};

//non-member function
Rational operator*(const Rational& temp1,const Rational& temp2){ return Rational(temp2.getA() * temp1.getA(),temp2.getB() * temp1.getB());};
std::ostream& operator<<(std::ostream &a,const Rational &b)
{
    a << b.getA() << "/" << b.getB()<<std::endl;
    return a;
}

int main(int argc, char const *argv[])
{
    Rational r1(1,2),r3;
    //r3 = r1 * 2;//正确，不需要类型转换
    r3 = 2 * r1;//错误，需要类型转换
    std::cout<<r1<<r3<<std::endl;
    return 0;
}
